﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "test.h"

using namespace std;

// 命名空间是为了解决多人合作中取名重复的问题

// 1.命名空间只能写在全局，不能写在方法或函数内部
namespace A {
	int a;
	void func() {

	}
}
// 2.命名空间可以嵌套 
namespace Maker {
	int a;
	namespace B {
		int b; // 全局变量默认值为0，加上命名空间也算全局变量
	}
}
// 3.命名空间是开放的，可以随时添加成员，此处的Maker和上面的Maker是同一个，但是使用要在加入之后，否则运行时报错，而编译时不报错 
namespace Maker {
	int c = 30;
}

// 匿名命名空间，类似于 static int d = 50; 其他文件中使用不了 
namespace {
	int d = 50;
}

// 定义全局函数 
void test01() {
	// 命名空间取别名
	namespace nameMaker = Maker;
	// ::是作用域符号，用于访问某个作用域里面的成员，通常情况下，如果有两个变量，一个是全局变量，一个是局部变量，那么，局部变量在其作用域内具有较高的优先级，它将屏蔽全局变量
	cout << "命名空间取别名：" << nameMaker::a << endl;
}

// 全局变量mya，位于全局常量区
int mya = 10;

// 静态常量只在当前文件中可以使用，不能在其他文件中使用
static int myb = 16;

int main()
{
	// 局部变量mya，位于线程栈
	int mya = 20;
	cout << "mya=" << mya << endl; // 变量作用域就近原则 20 
	cout << "::mya=" << ::mya << endl; // 作用域符号::前面为空，表示全局作用域 10 
	cout << Maker::c << endl; // 30 
	cout << Maker::B::b << endl; // 0 
	cout << d << endl; // 50 
	test01(); 

	// test.h中声明，实际链接调用到test.cpp 
	myMaker1::func();

	system("pause");
	return EXIT_SUCCESS;
}